package com.qf.controller;

import com.qf.utils.R;
import org.apache.commons.io.FileUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@RestController
public class UploadController {
    // 设置上传文件保存的目录
    private static final String UPLOAD_DIR = "D:/test/a/";

    //静态代码块
    static {
        // 创建目标目录，如果不存在
        File directory = new File(UPLOAD_DIR);
        if (!directory.exists()) {
            directory.mkdirs();
        }
    }
    @PostMapping("/upload1")
    //ResponseEntity  就是spring自带的返回的json格式的实体类 类似于R
    public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) {
        System.out.println("file:"+file);
        // 获取文件名并进行清理  StringUtils  是Spring框架 提供字符串操作的工具类
        String fileName = StringUtils.cleanPath(file.getOriginalFilename());
        Path targetLocation = Paths.get(UPLOAD_DIR + fileName);
        //targetLocation  上传路径
        try {
            // 将文件保存到本地磁盘  核心代码
            Files.copy(file.getInputStream(), targetLocation);

            // 返回图片的 URL
            String imageUrl = "/images/" + fileName;
            return ResponseEntity.ok().body("{\"imageUrl\": \"" + imageUrl + "\"}");
        } catch (IOException e) {
            return ResponseEntity.status(500).body("文件上传失败");
        }
    }
    // 提供静态资源映射，供前端访问上传的图片
    @GetMapping("/images/{fileName}")
    public ResponseEntity<?> getFile(@PathVariable String fileName) {
        try {
            Path path = Paths.get(UPLOAD_DIR + fileName);
            byte[] imageBytes = Files.readAllBytes(path);
            return ResponseEntity.ok().body(imageBytes);
        } catch (IOException e) {
            return ResponseEntity.status(404).body("文件未找到");
        }
    }
    @PostMapping("/upload")
    /**
     * 接收文件,上传文件到服务器
     * ----------------------
     * 方法的参数列表设置MultipartFile类型参数,
     * 参数名与前端name一致,即可绑定数据， 将图片给咱们的MultipartFile 对象了
     */
    public R upload (MultipartFile  file, HttpServletRequest request) throws IOException {
    /**
     * file中有前端发的那个文件对象全部信息  2.jpg
     * 思路:
     * 1.获得原始文件名  2.jpg
     * 2.重命名文件名   7267njhy2u2j28.jpg
     * 3.确定Tomcat位置,创建文件夹单独存储图片
     * 4.开始上传
     */
    // 2. 获得最终上传的目的地路径(上传至服务器中当前项目下)
    // 通过servlet方法获得路径,即最终上传到Tomcat的/upload
        String realPath = request.getServletContext().getRealPath("/upload");
        System.out.println("图片真实存的服务器的路径:"+realPath);
        //3.创建服务器住上传图片的真实的路径 文件夹
        File file1 = new File(realPath);
        if (!file1.exists()) {
            //不存在则创建
            file1.mkdir();
        }
        //4.获取文件的名字
        /*
         * 文件名重复时不能重复上传文件
         */
        String fileName = file.getOriginalFilename();
        System.out.println("图片的原始名字：" + fileName);
        //获取图片的后缀 bg.jpg
        //fileName.lastIndexOf(".");
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
        System.out.println(suffix);//jpg  png  等
        //文件的新名字， 把当前毫秒值当成文件的新名字
        long prefix = System.currentTimeMillis();//
        //组装成新的文件
        String newFileName = prefix + "." + suffix;
        System.out.println("文件的新的名字:" + newFileName);
        File newFile = new File(file1, newFileName);//

        //把上面的newFile对象
        //开始使用工具类上传存
        // 到执行的路径即可
        FileUtils.writeByteArrayToFile(newFile, file.getBytes());

        //c:/aaa/2.png  复制  d: /bbb/3.png
        // 4 返回路径,测试使用,放查看是否上传成功
        String localAddr = request.getLocalAddr();
        System.out.println(localAddr);
        String path = "http://localhost:8080/upload/"+newFileName;
        System.out.println(path);


        return R.ok(path);
    }
}
